package _interface;

import _interface.Exer.Camera;
import _interface.Exer.Computer;
import _interface.Exer.Printer;
import _interface.Exer.USB;
import org.junit.Test;

/**
 * 接口 interface
 * <p>
 * 接口就是规范，定义的是一组规则，体现了现实世界中“如果你是/要...则必须能...”的思想。
 * 继承是一个“是不是”的 is-a 关系，而接口实现则是“能不能”的 has-a 关系。
 * <p>
 * 接口的本质是契约、标准、规范。
 * <p>
 * 接口的内部结构的说明：
 * > 可以声明
 * ---属性：必须使用 public static final 修饰。
 * ---方法：-jdk8之前：声明抽象方法，修饰为 public abstract；
 * ---------jdk8：声明为静态方法、默认方法
 * ---------jdk9：声明私有方法
 * > 不可以声明： 构造器、代码块等；
 * <p>
 * > 接口与类的关系： 实现关系
 * 类必须将实现的接口中的所有的抽象方法都重写（或实现），方可实例化。否则，此实现类必须声明为抽象类。
 * > 接口与接口的关系：继承关系，可以多继承
 * > 接口的多态性： 接口名 变量名 = new 实现类对象;
 * <p>
 * JDK8 接口新特性：定义默认方法
 * ① 接口中声明的静态方法只能被接口调用，不能使用其实现类进行调用。与类不同。
 * ② default 默认方法。接口中声明的默认方法可以被实现类继承，
 * 实现类在没有重写此方法的情况下，默认调用接口中声明的默认方法。
 * 如果实现类重写了此方法，则调用的是自己重写的方法。
 * ③ 类实现了两个接口，而两个接口中定义了同名同参数的默认方法。
 * 则实现类在没有重写此两个类接口默认方法的情况下，会报错。----->接口冲突
 * 要求：此时实现类必须要重写接口中定义的同名同参数的方法。
 * ④ 子类（或实现类）继承了父类并实现了接口。
 * 父类和接口中声明了同名同参数的方法。（接口中的是默认方法。）
 * 默认情况下，子类（实现类）在没有重写此方法的情况下，调用的是父类中的方法。--->类优先原则
 * ⑤ 在实现类中调用接口中的方法。
 * interfaceName.super.xxMethod(); // 调用interfaceName中的xxMethod()方法。
 * <p>
 * JDK9 接口新特性：定义私有方法
 *
 */
public class InterfaceTest {
    @Test
    public void testUSB() {
        Computer computer = new Computer();
        // 1.创建接口实现类的对象
        Printer printer = new Printer();
        computer.transferData(printer);

        // 2.创建接口实现类的匿名对象
        computer.transferData(new Camera());

        // 3.创建接口匿名实现类的对象
        USB usb = new USB() {
            @Override
            public void start() {
                System.out.println("U盘已连接...");
            }

            @Override
            public void stop() {
                System.out.println("U盘已断开连接...");
            }
        };

        // 4.创建接口匿名实现类的匿名对象
        computer.transferData(new USB() {
            @Override
            public void start() {
                System.out.println("扫描仪开始工作...");
            }

            @Override
            public void stop() {
                System.out.println("扫描仪结束工作...");
            }
        });
    }
}
